/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package baseDatos;

import entidades.Animal;
import entidades.Bateria;
import entidades.Camara;
import entidades.Historial;
import entidades.Jaula;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import oracle.sql.DATE;

/**
 *
 * @author Facundo
 */
public class AnimalDAO_facu {
     private String query;
     private Connection conDB;
     private PreparedStatement pst;
     

    public AnimalDAO_facu(Connection con) {
        this.conDB = con;
    }

 //  public AnimalDAO(String nombre) {
   //     super(nombre);
    //}

    public AnimalDAO_facu() {
    }

    /**
     * @return the query
     */
    public String getQuery() {
        return query;
    }

    /**
     * @param query the query to set
     */
    public void setQuery(String query) {
        this.query = query;
    }

    /**
     * @return the conDB
     */
    public Connection getConDB() {
        return conDB;
    }

    /**
     * @param conDB the conDB to set
     */
    public void setConDB(Connection conDB) {
        this.conDB = conDB;
    }

    /**
     * @return the pst
     */
    public PreparedStatement getPst() {
        return pst;
    }

    /**
     * @param pst the pst to set
     */
    public void setPst(PreparedStatement pst) {
        this.pst = pst;
    }

    /*
     * Metodo para insertar un animal recien nacido.
     * Recibe por parametro, un animal.
     * El animal se inserta en la base con los siguientes datos:
     * codigo_animal
     * nombre
     * madre
     * padre
     * ubicacion (codigo de jaula)
     * fecha de nacimiento
     * fecha de destete aproximada
     * fecha de ralgro aproximada
     */
    public boolean put(Animal ani) {
        boolean ret = false;
        Animal aux = null;
        try {
            /*
             * debemos verificar que ese animal no exista en la base, utilizamos su nombre y su fecha de
             * nacimiento
             */
            aux = this.getAnimal(ani.getNombre(),ani.getFecha_nacimiento());
            if (aux == null) {
                /*
                 * buscamos el codigo el codigo de la madre y del padre
                 */
                int codigoMadre=-1;
                int codigoPadre=-1;
                if(ani.getMadre()!=null)
                    codigoMadre = new AnimalDAO(this.getConDB()).getCodigoAnimal(ani.getMadre());
                if(ani.getPadre()!=null)
                    codigoPadre = new AnimalDAO(this.getConDB()).getCodigoAnimal(ani.getPadre());
                /*
                 * Aka, se declara un iterator para el recorrer un array de baterias, perteneciente a una
                 * determinada camara. Luego se declara otro iterator para recorrer un array de jaulas
                 * pertenecientes a una determinada bateria.                 *
                 */
                Iterator iter = ani.getUbicacion().getBateria().iterator();
                Bateria bat = (Bateria) iter.next();
                Iterator iter2 = bat.getJaula().iterator();
                Jaula jau = (Jaula) iter2.next();
                /*
                 * Luego de obtenida la jaula y la bateria, ya que la camara ya la teniamos a trvez del animal,
                 * debemos obtener el codigo de cada una de ellas, para poder insertar el codigo de la jaula,
                 * en la tabla animal.
                 */
                int codigoTipoCamara = new TipoCamaraDAO(this.getConDB()).devolverCodigoCamara(ani.getUbicacion().getTipo_camara().getNombre());
                int codigoCamara = new CamaraDAO(this.getConDB()).getCodigoCamara(ani.getUbicacion().getNombre(), codigoTipoCamara);
                int codigoBateria = new BateriaDAO(this.getConDB()).devolverCodigoBateria(bat.getNombre(),codigoCamara);
                int codigoJaula = new JaulaDAO(this.getConDB()).devolverCodigoJaula(jau.getNombre(), codigoBateria);
                /*
                 * debemos obtener el nuevo codigo del animal, para eso utilizamos el metodo getUltimoCodigo
                 * que trae el ultimo codigo y le sumamos uno
                 */
                int codigoAnimal = this.getUltimoCodigo()+1;
                /*
                 * en este paso realizamos un manejo de las fechas de nacimiento y de destete
                 */
                 String fecha = ani.getFecha_nacimiento().toString();
                 String fecha_dia = fecha.substring(8);
                 String fecha_año = fecha.substring(0,4);
                 String fecha_mes = fecha.substring(5,7);
                 if(ani.getFecha_destete_aprox()!=null){
                    String fecha2 = ani.getFecha_destete_aprox().toString();
                    String fecha_dia2 = fecha2.substring(8);
                 String fecha_año2 = fecha2.substring(0,4);
                 String fecha_mes2 = fecha2.substring(5,7);
                 }

                 int codigoCategoria = -1;
                 if(ani.getCategoria()!=null){
                     codigoCategoria = new CategoriaDAO(this.getConDB()).devolverCodigoCategoria(ani.getCategoria().getNombre());
                 }

                 if(codigoMadre!=-1 && codigoPadre!=-1){
                     setQuery("insert into PC_ANIMAL (nombre,madre,padre,fecha_nacimiento,codigo_ubicacion,codigo_animal,fecha_destete_aproximada,fecha_ralgro_aproximada,fecha_peleteo_aproximada) " +
                        " values ( UPPER('"+ ani.getNombre() + "')," + codigoMadre + "," + codigoPadre +
                        ", to_date('"+ani.getFecha_nacimiento().dateValue()+"','YYYY-MM-DD'), " +
                        codigoJaula +","+codigoAnimal+", to_date('"+ani.getFecha_destete_aprox().dateValue()+"','YYYY-MM-DD'),to_date('"+ani.getFecha_ralgro_aprox().dateValue()+"','YYYY-MM-DD'),to_date('"+ani.getFecha_peleteado_aprox().dateValue()+"','YYYY-MM-DD'))");
                 }
                 else{
                     if(codigoMadre!=-1){
                        setQuery("insert into PC_ANIMAL (nombre,madre,fecha_nacimiento,codigo_ubicacion,codigo_animal,fecha_destete_aproximada,fecha_ralgro_aproximada) " +
                        " values ( UPPER('"+ ani.getNombre() + "')," + codigoMadre +
                        ", to_date('"+ani.getFecha_nacimiento().dateValue()+"','YYYY-MM-DD'), " +
                        codigoJaula +","+codigoAnimal+", to_date('"+ani.getFecha_destete_aprox().dateValue()+"','YYYY-MM-DD'),to_date('"+ani.getFecha_ralgro_aprox().dateValue()+"','YYYY-MM-DD'))");
                     }
                     else{
                         if(codigoPadre!=-1){
                            setQuery("insert into PC_ANIMAL (nombre,padre,fecha_nacimiento,codigo_ubicacion,codigo_animal) " +
                        " values ( UPPER('"+ ani.getNombre() + "')," + codigoPadre +
                        ", to_date('"+ani.getFecha_nacimiento().dateValue()+"','YYYY-MM-DD'), " +
                        codigoJaula +","+codigoAnimal+")");
                         }
                         else{
                             //ESTAMOS EN EL CASE DEL ANIMAL COMPRADO
                             //SE UBICARA EN UNA JAULA ESPECIFICA, DEBEMOS SETEARLA SU ESTADO
                             setQuery("insert into PC_ANIMAL (nombre,fecha_nacimiento,codigo_sexo,codigo_ubicacion,codigo_animal,codigo_categoria) " +
                        " values ( UPPER('"+ ani.getNombre() + "'), to_date('"+ani.getFecha_nacimiento().dateValue()+"','YYYY-MM-DD'), '" + ani.getSexo().getNombre() + "',"+
                        codigoJaula +","+codigoAnimal+"," + codigoCategoria+")");
                             int codigoEstadoOcupado = new EstadoJaulaDAO(this.getConDB()).devolverCodigoEstadoJaula("OCUPADO");
                             new JaulaDAO(this.getConDB()).updateEstadoJaula(codigoJaula, codigoEstadoOcupado);
                         }
                         
                     }
                 }

                 /*
                setQuery("insert into PC_ANIMAL (nombre,madre,padre,fecha_nacimiento,codigo_ubicacion,codigo_animal,fecha_destete_aproximada)" +
                        " values ( '"+ ani.getNombre() + "'," + codigoMadre + "," + codigoPadre + ",'" + fecha_año+ "-"+fecha_dia+"-"+fecha_mes+  "',"+
                          codigoJaula +","+codigoAnimal+",'" + fecha_año2+ "-"+fecha_dia2+"-"+fecha_mes2+  "');");
                  *
                  */
                setPst(getConDB().prepareStatement(getQuery()));         
               
                ret = getPst().execute();
                System.out.println("            llega a pasar el put     ");
                getPst().close();
                return true;
            } 
        } catch (SQLException ex) {
            Logger.getLogger(AnimalDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }

    /*
     * Metodo que modifica un animal, en cuanto a su sexo, ubicacion y categoria. Este metodo se debe
     * aplicar para cuando se realiza el destete del animal
     * Recibe como parametro un animal, que debe estar registrado en la base.
     * Primero se debe verificar que la jaula este libre y
     * luego se llama a un metodo de estado de jaula y la coloca como ocupada
     */
    public boolean updateDestete(Animal ani) {
        boolean band = false;
        Animal aux = null;
         //int codigoCategoria = new CategoriaDAO(this.getConDB()).devolverCodigoCategoria(ani.getCategoria().getNombre());
        /*
         * Aka, se declara un iterator para el recorrer un array de baterias, perteneciente a una
         * determinada camara. Luego se declara otro iterator para recorrer un array de jaulas
         * pertenecientes a una determinada bateria.                 *
         */
        Iterator iter = ani.getUbicacion().getBateria().iterator();
        Bateria bat = (Bateria) iter.next();
        Iterator iter2 = bat.getJaula().iterator();
        Jaula jau = (Jaula) iter2.next();
        /*
         * Luego de obtenida la jaula y la bateria, ya que la camara ya la teniamos a trvez del animal,
         * debemos obtener el codigo de cada una de ellas, para poder insertar el codigo de la jaula,
         * en la tabla animal.
         */
        int codigoTipoCamara = new TipoCamaraDAO(this.getConDB()).devolverCodigoCamara(ani.getUbicacion().getTipo_camara().getNombre());
        int codigoCamara = new CamaraDAO(this.getConDB()).getCodigoCamara(ani.getUbicacion().getNombre(), codigoTipoCamara);
        int codigoBateria = new BateriaDAO(this.getConDB()).devolverCodigoBateria(bat.getNombre(),codigoCamara);
        int codigoJaula = new JaulaDAO(this.getConDB()).devolverCodigoJaula(jau.getNombre(), codigoBateria);
        /*
         * debemos verificar que ese animal no exista en la base, utilizamos su nombre y su fecha de
         * nacimiento
         */
        aux = this.getAnimal(ani.getNombre(), ani.getFecha_nacimiento());
        /*
         * Ahora debemos verificar que la jaula este disponible
         */
        int codigoEstadoLibre = new EstadoJaulaDAO(this.getConDB()).devolverCodigoEstadoJaula("LIBRE");
        int codigoEstadoOcupado = new EstadoJaulaDAO(this.getConDB()).devolverCodigoEstadoJaula("OCUPADO");
        Jaula jauDisponible = new JaulaDAO(this.getConDB()).getJaulaEstado(codigoJaula, codigoEstadoLibre);
        try {
            if (aux != null && jauDisponible != null) {
                setQuery("update PC_ANIMAL set " +
                        "codigo_categoria= " + ani.getCategoria() +
                        ", codigo_sexo = '" + ani.getSexo()+ "' " +
                        ", codigo_ubicacion=" + codigoJaula +
                        " where nombre='" + ani.getNombre() + "' " +
                        " and fecha_nacimiento= to_date('" + ani.getFecha_nacimiento() + "','YYYY-MM-DD')");
                setPst(getConDB().prepareStatement(getQuery()));
                getPst().executeQuery();
                getPst().close();
                band = true;
            } else {
                return false;
            }
        } catch (SQLException ex) {
            Logger.getLogger(AnimalDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        /*
         * Si se pudo actualizar el destete del animal, actualizamos su ubicacion
         */
        if(band){
            new JaulaDAO(this.getConDB()).updateEstadoJaula(codigoJaula, codigoEstadoOcupado);            
        }
        return true;
    }

    /*
     * Metodo que modifica la jaula de un gazapo
     * Se recibe el codigo de la jaula, si es -1 se actualiza como null
     * seguramente el animal murio
     */
    public boolean updateJaula(int codigoAnimal, int codigoJaula){
        System.out.println("se muestra el coddddiiiiiigo de la animaal"+codigoAnimal);
        System.out.println("se muestra el coddddiiiiiigo de la animaal"+codigoAnimal);
        System.out.println("se muestra el coddddiiiiiigo de la jaula"+codigoJaula);
         try {
                if(codigoJaula==-1){
                    setQuery("update PC_ANIMAL set " +
                        "codigo_ubicacion= NULL " +
                        " where codigo_animal=" + codigoAnimal);
                }
                else{
                    setQuery("update PC_ANIMAL set " +
                        "codigo_ubicacion= " + codigoJaula +
                        " where codigo_animal=" + codigoAnimal);
                }
                setPst(getConDB().prepareStatement(getQuery()));
                getPst().executeQuery();
                getPst().close();
                return true;
        } catch (SQLException ex) {
            Logger.getLogger(AnimalDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
         return false;
    }
   
    /*
     * Metodo para devolver todos los animales de la base.
     */
    public ArrayList getAnimales(){
        ArrayList todos = null;
        todos = this.devolverAnimales("select * from PC_ANIMAL");
        return todos;
    }


    /*
     * Metodo para devolver un arrayList con todos los animales que se pueden destetar.
     * Crea la sentencia con la condicion de que la fecha_aproximada_destete >= fechaParametro.
     * Tiene parametro de entrada, la fecha a comparar y como salida un arrayList de animales
     */
    public ArrayList animalesDestetar(DATE fecha){
        ArrayList todos = null;
        setQuery("select * from PC_ANIMAL where fecha_destete_aproximada >= '"+ fecha + "'");
        todos = this.devolverAnimales(getQuery());
        return todos;
    }

    /*
     * Metodo que devuelve un ArrayList con todos los animales que se pueden ralgrear.
     * Crea la sentencia con la condicion de que la fecha_aproximada_ralgro >= fechaParametro.
     * Tiene como parametro de entrada la fecha a comparar y como salida el array con los animales
     */
    public ArrayList animalesRalgrear(DATE fecha){
        ArrayList todos = null;
        setQuery("select * from PC_ANIMAL where fecha_ralgro_aproximada >= '" + fecha + "'");
        todos = this.devolverAnimales(getQuery());
        return todos;
    }

    /*
     * Metodo que devuelve un ArrayList con todos los animales que se pueden peletear.
     * Crea la sentencia con la condicion de que la fecha_peleteado >= fechaParametro.
     * Tiene como parametro de entrada la fecha a comparar y como salida el array con los animales
     */
    public ArrayList animalesPeletear(DATE fecha){
        ArrayList todos = null;
        setQuery("select * from PC_ANIMAL where fecha_peleteado >= '" + fecha + "'");
        todos = this.devolverAnimales(getQuery());
        return todos;
    }

    /*
     * Metodo que devuelve un array con todos los animales de la base de acuerdo a la sentencia que recibe
     * como parametro.
     * retorna un arrayList de animales
     *
     */
     private ArrayList devolverAnimales(String sentencia) {
        ArrayList todos = null;
        Animal ani = null;
        DATE fecha = null;
        try {
            todos = new ArrayList();
            ResultSet rs;
            setQuery(sentencia);
            setPst(getConDB().prepareStatement(getQuery()));
            rs = getPst().executeQuery();
            while (rs.next()) {
                ani = new Animal();
                ani.setNombre(rs.getString("nombre"));
                fecha = new DATE( rs.getDate("fecha_nacimiento"));
                ani.setFecha_nacimiento(fecha);
                fecha = null;
                if(String.valueOf(rs.getInt("madre"))!=null){
                    ani.setMadre(this.devolverAnimalReducido(rs.getInt("madre")));
                }
                if(String.valueOf(rs.getInt("padre"))!=null){
                    ani.setPadre(this.devolverAnimalReducido(rs.getInt("padre")));
                }
                if(rs.getString("codigo_sexo")!=null){
                    ani.setSexo(new SexoDAO(this.getConDB()).getSexo(rs.getString("codigo_sexo").charAt(0)));
                }
                if(rs.getString("codigo_ubicacion")!=null){
                    /*
                 * aca debemos tener en cuenta como obtener la camara a la cual pertenece
                 * la jaula en la cual se ubica el animal. Tenemos como primer dato, el codigo de la jaula
                 * que viene desde la base, atravez de ese codigo debemos obtenerl objeto jaula,
                 * luego debemos obtener el objeto bateria (parametros codigo de bateria que esta en la jaula)
                 * y por ultimo la camara.
                 * A tener en cuenta que en cada uno de los arrays debe tener un solo objeto, para poder definir
                 * la direccion de ese animal
                 */
                //declaramos un array de jaulas
                ArrayList jaulas = new ArrayList();
                //buscamos el codigo de la jaula para poder buscar el objeto jaula en la base
                int codigoJaula = rs.getInt("codigo_ubicacion");
                //buscamos en la base la jaula y la agregamos al array
                jaulas.add(new JaulaDAO(this.getConDB()).getJaula(codigoJaula));
                //buscamos el codigo de la bateria para poder bucar el objeto bateria en la base
                int codigoBateria = new JaulaDAO(this.getConDB()).devolverCodigoBateria(codigoJaula);
                //buscamos en la base la bateria de acuerdo a su codigo
                Bateria bat = new BateriaDAO(this.getConDB()).getBateria(codigoBateria);
                //le agregamos a la bateria el array de jaulas
                bat.setJaula(jaulas);
                //declaramos un array de baterias
                ArrayList baterias = new ArrayList();
                //agregamos al array de baterias, la bateria ya buscada
                baterias.add(bat);
                //buscamos el codigo de la camara a travez del codigo de la bateria que ya tenemos
                int codigoCamara = new BateriaDAO(this.getConDB()).devolverCodigoCamara(codigoBateria);
                //buscamos el objeto camara de acuerdo el codigo de camara que ya tenemos
                Camara cam = new CamaraDAO(this.getConDB()).getCamara(codigoCamara);
                //agregamos a la camara el array de baterias
                cam.setBateria(baterias);
                //agregamos al animal la camara obtenida como su ubicacion
                ani.setUbicacion(cam);
                }
                
                if(rs.getDate("fecha_destete_aproximada")!=null){
                    fecha = new DATE( rs.getDate("fecha_destete_aproximada"));
                    ani.setFecha_destete_aprox(fecha);
                    fecha = null;
                }
                if(rs.getDate("fecha_peleteo_aproximada")!=null){
                    fecha = new DATE( rs.getDate("fecha_peleteo_aproximada"));
                    ani.setFecha_peleteado_aprox(fecha);
                    fecha = null;
                }
                if(rs.getDate("fecha_ralgro_aproximada")!=null){
                    fecha = new DATE( rs.getDate("fecha_ralgro_aproximada"));
                    ani.setFecha_ralgro_aprox(fecha);
                    fecha = null;
                }
                   //agregamos la categoria, si es distinto de null
                    if(rs.getString("codigo_categoria")!=null){
                        ani.setCategoria(new CategoriaDAO(this.getConDB()).getCategoria(rs.getInt("codigo_categoria")));
                    }
                todos.add(ani);
            }
            rs.close();
            getPst().close();
        } catch (SQLException ex) {
            Logger.getLogger(AnimalDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return todos;
    }


   /*
    * Metodo que devuelve el ultimo animal nacido y registrado en la base.. Crea la sentencia
    * y se la envia a devolverAnimal() que retorna un objeto animal
    */
   public Animal getUltimoAnimal(){
       Animal ani = null;
       setQuery("select top 1 * from PC_ANIMAL order by fecha_nacimiento desc");
       ani = this.devolverAnimal(getQuery());
       return ani;
   }

    /*
     * Metodo que devuelve un animal determinado de acuerdo al nombre pasado por parametro.
     * Este metodo crea la sentencia y se la envia al metodo devolverAnimal(), que retorna
     * un objeto animal
     *
     */
    public Animal getAnimal(String nombre, DATE fechaNacimiento) {
        String fecha = fechaNacimiento.dateValue().toString();
        String fecha_dia = fecha.substring(8);
        String fecha_año = fecha.substring(0,4);
        String fecha_mes = fecha.substring(5,7);
        setQuery("SELECT * from PC_ANIMAL where nombre='" + nombre + "' and fecha_nacimiento=to_date('" + String.valueOf(fechaNacimiento.dateValue())+"','yyyy/MM/DD HH:MI')");//'"+ fecha_año+ "-"+fecha_dia+"-"+fecha_mes+ "'");
        Animal ani = this.devolverAnimal(getQuery());
        return ani;
    }

    /*
     * Metodo que devuelve un animal determinado de acuerdo al nombre pasado por parametro.
     * Este metodo crea la sentencia y se la envia al metodo devolverAnimal(), que retorna
     * un objeto animal
     *
     */
    public Animal getAnimal(int codigo) {
        //primero determinamos si el animal esta muerto!!!!
        setQuery("SELECT * from PC_ANIMAL where codigo_animal=" + codigo);
        Animal ani = this.devolverAnimal(getQuery());
        return ani;
    }
   
    /*
     * Metodo que devuelve un animal de acuerdo a su nombre
     */
    public Animal getAnimal(String nombre){
        //primero determinamos si el animal esta muerto!!!!
        //AKAAAAAAAAAA DEJEEEEEEEEEE
       setQuery("SELECT * from PC_ANIMAL where nombre= UPPER('" + nombre + "')");
       System.out.println(getQuery());
        Animal ani = this.devolverAnimal(getQuery());
        return ani;
   }

    /*
     * Metodo que devuelve un animal hembra que pertenece a alguna familia
     */
   public Animal getAnimalHembra(String nombre) {
       //primero determinamos si el animal esta muerto!!!!
        setQuery("SELECT * from PC_ANIMAL a where a.nombre= UPPER('"+ nombre +"') and a.codigo_animal in " +
                "(select codigo_hembra from PC_DETALLE_FAMILIA)");
        System.out.println(getQuery());
        Animal ani = this.devolverAnimal(getQuery());
        return ani;
    }

    /*
      * Metodo que devuelve un solo animal. parametro de entrada una sentencia.
     * si el animal esta muerto se debe devolver nulo!!!!!
      */
    private Animal devolverAnimal(String sentencia) {
        Animal ani = null;
        DATE fecha = null;
        ResultSet rs = null;        
        setQuery(sentencia);
        try {
            System.out.println("llega sadsadasdasdsd   " + getConDB());
            setPst(getConDB().prepareStatement(getQuery()));
            System.out.println(getPst());
            System.out.println(getQuery());
            rs = getPst().executeQuery();
            
            while (rs.next()) {
                ani = new Animal();
                //verificamos que el animal no este muerto!
                Historial histo = new HistorialDAO(this.getConDB()).getHistorialMuerte(rs.getInt("codigo_animal"));
                if(histo==null){
                    if(String.valueOf(rs.getInt("padre"))!=null){
                        //verificamos que el padre no esta muerto
                        if(new HistorialDAO(this.getConDB()).getHistorialMuerte(rs.getInt("padre")) ==null)
                            ani.setPadre(this.devolverAnimalReducido(rs.getInt("padre")));
                    }
                    if(String.valueOf(rs.getInt("madre"))!=null){
                        //verificamos que la madre no esta muerta
                        if(new HistorialDAO(this.getConDB()).getHistorialMuerte(rs.getInt("madre")) ==null)
                            ani.setMadre(this.devolverAnimalReducido(rs.getInt("madre")));
                    }
                    ani.setNombre(rs.getString("nombre"));
                    fecha = new DATE( rs.getDate("fecha_nacimiento"));
                    ani.setFecha_nacimiento(fecha);
                    if(rs.getString("codigo_sexo")!=null){
                        ani.setSexo(new SexoDAO(this.getConDB()).getSexo(rs.getString("codigo_sexo").charAt(0)));
                    }

                    if(rs.getString("codigo_ubicacion")!=null){
                        //declaramos un array de jaulas
                    ArrayList jaulas = new ArrayList();
                    //buscamos el codigo de la jaula para poder buscar el objeto jaula en la base
                    int codigoJaula = rs.getInt("codigo_ubicacion");
                    //buscamos en la base la jaula y la agregamos al array
                    jaulas.add(new JaulaDAO(this.getConDB()).getJaula(codigoJaula));
                    //buscamos el codigo de la bateria para poder bucar el objeto bateria en la base
                    int codigoBateria = new JaulaDAO(this.getConDB()).devolverCodigoBateria(codigoJaula);
                    //buscamos en la base la bateria de acuerdo a su codigo
                    Bateria bat = new BateriaDAO(this.getConDB()).getBateria(codigoBateria);
                    //le agregamos a la bateria el array de jaulas
                    bat.setJaula(jaulas);
                    //declaramos un array de baterias
                    ArrayList baterias = new ArrayList();
                    //agregamos al array de baterias, la bateria ya buscada
                    baterias.add(bat);
                    //buscamos el codigo de la camara a travez del codigo de la bateria que ya tenemos
                    int codigoCamara = new BateriaDAO(this.getConDB()).devolverCodigoCamara(codigoBateria);
                    //buscamos el objeto camara de acuerdo el codigo de camara que ya tenemos
                    Camara cam = new CamaraDAO(this.getConDB()).getCamara(codigoCamara);
                    //agregamos a la camara el array de baterias
                    cam.setBateria(baterias);
                    //agregamos al animal la camara obtenida como su ubicacion
                    ani.setUbicacion(cam);
                    }
                    
                    //agregamos la fecha de destete si es distinta de null
                    if(rs.getDate("fecha_destete_aproximada")!=null){
                        ani.setFecha_destete_aprox(new DATE(rs.getDate("fecha_destete_aproximada")));
                    }
//                    if(rs.getDate("fecha_peleteado")!=null){
  //                      ani.setFecha_peleteado_aprox(new DATE(rs.getDate("fecha_peleteado")));
    //                }
                    if(rs.getDate("fecha_ralgro_aproximada")!=null){
                        ani.setFecha_ralgro_aprox(new DATE(rs.getDate("fecha_ralgro_aproximada")));
                    }
                    //agregamos la categoria, si es distinto de null
                    if(rs.getString("codigo_categoria")!=null){
                        ani.setCategoria(new CategoriaDAO(this.getConDB()).getCategoria(rs.getInt("codigo_categoria")));
                    }
                }
                else
                    ani = null;
            }
            getPst().close();
            rs.close();
            return ani;
        } catch (SQLException ex) {
            Logger.getLogger(AnimalDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return ani;
    }
    /*
    * Metodo que devuelve un objeto animal, con solamente los atributos nombre, sexo, ubicacion
    * y fecha de nacimiento.
    * se utliza mas que nada para traer el padre y la madre de un gazapo
    * recibe como parametro el nombre del animal a buscar
    */
    private Animal devolverAnimalReducido(int codigo) {
        //primero determinamos si el animal esta muerto!!!!
        Animal ani = new Animal();
        ResultSet rs = null;     
        setQuery("select nombre, codigo_sexo, codigo_ubicacion,fecha_nacimiento from PC_ANIMAL where codigo_animal=" + codigo);
        try {
            setPst(getConDB().prepareStatement(getQuery()));
            rs = getPst().executeQuery();
            while (rs.next()) {

                ani.setNombre(rs.getString("nombre"));
                if(rs.getString("codigo_sexo")!=null){
                    ani.setSexo(new SexoDAO(this.getConDB()).getSexo(rs.getString("codigo_sexo").charAt(0)));
                }
                if(rs.getString("codigo_ubicacion")!=null){
                    //declaramos un array de jaulas
                ArrayList jaulas = new ArrayList();
                //buscamos el codigo de la jaula para poder buscar el objeto jaula en la base
                int codigoJaula = rs.getInt("codigo_ubicacion");
                //buscamos en la base la jaula y la agregamos al array
                jaulas.add(new JaulaDAO(this.getConDB()).getJaula(codigoJaula));
                //buscamos el codigo de la bateria para poder bucar el objeto bateria en la base
                int codigoBateria = new JaulaDAO(this.getConDB()).devolverCodigoBateria(codigoJaula);
                //buscamos en la base la bateria de acuerdo a su codigo
                Bateria bat = new BateriaDAO(this.getConDB()).getBateria(codigoBateria);
                //le agregamos a la bateria el array de jaulas
                bat.setJaula(jaulas);
                //declaramos un array de baterias
                ArrayList baterias = new ArrayList();
                //agregamos al array de baterias, la bateria ya buscada
                baterias.add(bat);
                //buscamos el codigo de la camara a travez del codigo de la bateria que ya tenemos
                int codigoCamara = new BateriaDAO(this.getConDB()).devolverCodigoCamara(codigoBateria);
                //buscamos el objeto camara de acuerdo el codigo de camara que ya tenemos
                Camara cam = new CamaraDAO(this.getConDB()).getCamara(codigoCamara);
                //agregamos a la camara el array de baterias
                cam.setBateria(baterias);
                //agregamos al animal la camara obtenida como su ubicacion
                ani.setUbicacion(cam);
                }
                ani.setFecha_nacimiento(new DATE(rs.getDate("fecha_nacimiento")));
            }
            getPst().close();
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(AnimalDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return ani;
    }
   
   /*
    * Metodo que devuelve el codigo del ultimo animal registrado en la base
    */
    public int getUltimoCodigo(){

       setQuery("SELECT MAX(CODIGO_ANIMAL) AS CODIGO_ANIMAL FROM PC_ANIMAL");
       // setQuery("select pa.codigo_animal from pc_animal pa where pa.fecha_nacimiento = (select max(fecha_nacimiento) from pc_animal)");
       //setQuery("SELECT MAX(CODIGO_ANIMAL) AS CODIGO_ANIMAL FROM PC_ANIMAL pa where SUBSTR(pa.fecha_nacimiento, 7) = (select SUBSTR(SYSDATE, 7) FROM DUAL)");
       int codigo = this.devolverCodigoAnimal(getQuery());
       return codigo;
 
    }
    public int getUltimoCodigoFecha(int año){

//       setQuery("SELECT MAX(CODIGO_ANIMAL) AS CODIGO_ANIMAL FROM PC_ANIMAL");
       // setQuery("select pa.codigo_animal from pc_animal pa where pa.fecha_nacimiento = (select max(fecha_nacimiento) from pc_animal)");
       setQuery("SELECT MAX(CODIGO_ANIMAL) AS CODIGO_ANIMAL" +
               " FROM PC_ANIMAL pa " +
               " where SUBSTR(pa.fecha_nacimiento, 7) = "+ año );


       int codigo = this.devolverCodigoAnimal(getQuery());
       return codigo;

    }
    /*
     * Metodo que devuelve el codigo de un animal. Recibe por parametro al animal.
     */
    public int getCodigoAnimal(Animal ani){
        System.out.println(ani.getFecha_nacimiento().dateValue());
        System.out.println(ani.getNombre());
        String fecha = ani.getFecha_nacimiento().toString();
        String fecha_dia = fecha.substring(8);
        String fecha_año = fecha.substring(0,4);
        String fecha_mes = fecha.substring(5,7);
        //setQuery("select codigo_animal from PC_ANIMAL where nombre like '%" + ani.getNombre() + "%' " +
          //       " and fecha_nacimiento='"+ fecha_año+ "-"+fecha_dia+"-"+fecha_mes   +"'");
        setQuery("select codigo_animal from PC_ANIMAL where nombre like '%" + ani.getNombre() + "%' " +
                 " and fecha_nacimiento= to_date('"+ ani.getFecha_nacimiento().dateValue() +"','YYYY-MM-DD')");
       // int codigo = this.devolverCodigoAnimal("select codigo_animal from animal where nombre like '%NNA2%' and fecha_nacimiento='2011-01-01'");
       System.out.println(getQuery());
        int codigo= this.devolverCodigoAnimal(getQuery());
         System.out.println("JUAJUAJAUAJA");
         return codigo;
    }

   /*
    * Metodo que devuelve el codigo de un animal determinado, recibe como parametro una sentencia de busqueda
    */
    private int devolverCodigoAnimal(String sentencia) {
        int codigo = -1;
        ResultSet rs = null;
        setQuery(sentencia);
       System.out.println(getQuery());
       System.out.println(getConDB());
        try {
            setPst(getConDB().prepareStatement(sentencia));
               System.out.println("paso de pedoooooooo");
            rs = getPst().executeQuery();
             System.out.println("paso de pedoooooooo2222");
            while (rs.next()) {
                 System.out.println("paso de pedoooooooo33333");
                 //System.out.println(rs.getString("nombre"));
                 //if(rs.getString("nombre")!=null){
                   // codigo = rs.getInt("MAX(codigo_animal)");
                //System.out.println(rs.getString("nombre"));
                 //}  else{
                     System.out.println("ERORRRRRR");
                 //}
                     codigo=rs.getInt("CODIGO_ANIMAL");
                         


            }
            getPst().close();
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(AnimalDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return codigo;
    }

    /*
     * metodo que trae el nombre de un animal recibe como parametro el codigo del animal
     */
    public String devolverNombreAnimal(int codigo) {
        String nombre="";
        ResultSet rs = null;
        setQuery("select NOMBRE from PC_ANIMAL where codigo_animal=" + codigo);
       System.out.println(getQuery());
       System.out.println(getConDB());
        try {
            setPst(getConDB().prepareStatement(getQuery()));
               System.out.println("paso de pedoooooooo");
            rs = getPst().executeQuery();
             System.out.println("paso de pedoooooooo2222");
            while (rs.next()) {
                 System.out.println("paso de pedoooooooo33333");
                nombre = rs.getString("NOMBRE");
                System.out.println(nombre);
            }
            getPst().close();
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(AnimalDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return nombre;
    }

    /*
     * Metodo que devuelve la fecha de nacimiento de un animal. Recibe como
     * parametro el codigo del animal
     */
    public DATE devolverFechaNacimientoAnimal(int codigo) {
        DATE fecha=null;
        ResultSet rs = null;
                System.out.println("TTTTTTTTTTRRRRRRRRAAAAAAAAEEEEEEEEE fecha: "+codigo);
        setQuery("select FECHA_NACIMIENTO from PC_ANIMAL where codigo_animal=" + codigo);
       System.out.println(getQuery());
       System.out.println(getConDB());
        try {
            setPst(getConDB().prepareStatement(getQuery()));
               System.out.println("paso de pedoooooooo");
            rs = getPst().executeQuery();
             System.out.println("paso de pedoooooooo2222");
            while (rs.next()) {
                 System.out.println("paso de pedoooooooo33333");
                fecha = new DATE(rs.getDate("FECHA_NACIMIENTO"));
                System.out.println("TTTTTTTTTTRRRRRRRRAAAAAAAAEEEEEEEEE fecha: "+fecha.dateValue());
            }
            getPst().close();
            rs.close();
            return fecha;
        } catch (SQLException ex) {
            Logger.getLogger(AnimalDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return fecha;
    }

    /*
     * Metodo que devuelve el padre de una familia.Recibe por parametro el nombre de la madre
     */
    public Animal devolverPadre(Animal madre) {
        Animal padre = null;
        ResultSet rs = null;
        String sentencia = null;
        int codigoMadre = this.getCodigoAnimal(madre);
        sentencia = " Select codigo_padre from PC_FAMILIA , PC_DETALLE_FAMILIA  where codigo_familia = numero_familia and codigo_hembra=" + codigoMadre ;
        System.out.println("pASO DELVOLVER PADRE");
        System.out.println(sentencia);
        setQuery(sentencia);
        try {
            setPst(getConDB().prepareStatement(getQuery()));
            rs = getPst().executeQuery();
            while (rs.next()) {
                padre = new Animal();
                System.out.println( rs.getInt("codigo_padre"));
                padre = this.getAnimal(rs.getInt("codigo_padre"));                                
              }
            getPst().close();
            rs.close();            
        } catch (SQLException ex) {
            Logger.getLogger(AnimalDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return padre;
    }

   
    /*
     * Metodo que devuelve el siguiente nombre para un nuevo animal
     */
    public String nuevoNombre(){
        //obtnemos el codigo del ultimo animal
        System.out.println("nuevo nombreee");
                
        int codigoUltimo = this.getUltimoCodigo();
        //declaramos el nuevoNombre
        String nuevoNombre = "";
        //traemos de la base el ultimo animal registrado
        // Animal ani = this.getAnimal(codigoUltimo);
         //obtenemos su nombre
         String nombre = this.devolverNombreAnimal(codigoUltimo);
         System.out.println(nombre);
         //obtenemos el numero del nombre
         String numeroNombre = nombre.substring(3);
         //obtenemos la letra del nombre
         String letraAñoNombre = nombre.substring(2, 3);
         System.out.println("nombre nombre nombre"+numeroNombre);
         System.out.println(""+letraAñoNombre);
         //convertimos el numero del nombre en un entero le sumamos uno y luego lo volvemos a string
         int numero = Integer.parseInt(numeroNombre);
         String numeroNombreMas = String.valueOf(numero+1);
         //obtenemos la fecha de hoy
         
         DATE fecha = new FechaDAO(this.getConDB()).tomarFecha();
         System.out.println(fecha.dateValue());       

         if (this.devolverFechaNacimientoAnimal(codigoUltimo).dateValue().getYear()==fecha.dateValue().getYear()){
             nuevoNombre = "NN"+letraAñoNombre+numeroNombreMas;
             System.out.println("NAAAAAAAAMMMMMBBREERERER1111111111: " +nuevoNombre);
         }
         else{
             //buscamos la letra del año actual en la base
             letraAñoNombre = this.traerLetra(fecha.dateValue().getYear());
             nuevoNombre = "NN"+letraAñoNombre+"1";
             System.out.println("NAAAAAAAAMMMMMBBREERERER22222222222: " +nuevoNombre);
         }
         return nuevoNombre;
    }

     /*
     * Metodo que devuelve el siguiente nombre para un nuevo animal
     */
//    public String nuevoNombre2(int año){
//        //obtnemos el codigo del ultimo animal
//        System.out.println("nuevo nombreee  año "+año);
//
//        //buscamos el utlimo animal registrado para ese año de nacimiento 'fecha'
//
//        String codigoUltimo = this.getUltimoCodigoFecha2();
//
//
//        System.out.println("ZZZZZZZZZZZzz   "+codigoUltimo);
//
//
//
////
////
////        //declaramos el nuevoNombre
////        String nuevoNombre = "";
////        //traemos de la base el ultimo animal registrado
////        // Animal ani = this.getAnimal(codigoUltimo);
////         //obtenemos su nombre
////         String nombre = this.devolverNombreAnimal(codigoUltimo);
////         System.out.println(nombre);
////         //obtenemos el numero del nombre
////         String numeroNombre = nombre.substring(3);
////         //obtenemos la letra del nombre
////         String letraAñoNombre = nombre.substring(2, 3);
////         System.out.println("nombre nombre nombre"+numeroNombre);
////         System.out.println(""+letraAñoNombre);
////         //convertimos el numero del nombre en un entero le sumamos uno y luego lo volvemos a string
////         int numero = Integer.parseInt(numeroNombre);
////         String numeroNombreMas = String.valueOf(numero+1);
////         //obtenemos la fecha de hoy
////
////         DATE fecha = new FechaDAO(this.getConDB()).tomarFecha();
////         System.out.println(fecha.dateValue());
////
////         if (this.devolverFechaNacimientoAnimal(codigoUltimo).dateValue().getYear()==fecha.dateValue().getYear()){
////             nuevoNombre = "NN"+letraAñoNombre+numeroNombreMas;
////             System.out.println("NAAAAAAAAMMMMMBBREERERER1111111111: " +nuevoNombre);
////         }
////         else{
////             //buscamos la letra del año actual en la base
////             letraAñoNombre = this.traerLetra(fecha.dateValue().getYear());
////             nuevoNombre = "NN"+letraAñoNombre+"1";
////             System.out.println("NAAAAAAAAMMMMMBBREERERER22222222222: " +nuevoNombre);
////         }
//         return "";
//    }


    


   /*
    *
    * Metodo que trae un alias de acuerdo el año pasado por parametro.
    * Se implementa en este AnimalDAO..
    */
     public String traerLetra(int año) {
        String nombre=null;
        ResultSet rs = null;
        setQuery("select letra from PC_AÑO_LETRA where año =" + año);
        try{
            setPst(getConDB().prepareStatement(getQuery()));
            rs = getPst().executeQuery();
            while (rs.next()) {
            nombre = rs.getString("letra");
            System.out.println("muestro la letra del año: "+nombre);
            }
            getPst().close();
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(AnimalDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return nombre;
    }



private String getUltimoCodigoFecha2() {
     try {
          String aux = "lalL";
          ResultSet rs = null;
           //setQuery("select nombre from pc_animal WHERE SUBSTR(fecha_nacimiento,7,4) like '%2011%'");
          setQuery("select * from pc_animal WHERE to_date(fecha_nacimiento,'DD/MM/YYYY') between '01/01/2011' and '01/05/2011'");
            setPst(getConDB().prepareStatement(getQuery()));
               System.out.println("paso de pedoooooooo");
            rs = getPst().executeQuery();
             System.out.println("paso de pedoooooooo2222");
            while (rs.next()) {
                 System.out.println("paso de pedoooooooo33333");
                aux = rs.getString("nombre");
                System.out.println(aux);
            }
            getPst().close();
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(AnimalDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        return null;
    }


    /*
     * Metodos de pruebas, para otra base de datos... no prestar atencion!!!!
     */
//    public Animal2 getAnimal2(String nombre) {
//        setQuery("SELECT * from Animal2 where nombre='" + nombre + "'");
//        Animal2 ani = this.devolverAnimal2(getQuery());
//        return ani;
//    }
//
//    private Animal2 devolverAnimal2(String sentencia) {
//        Animal2 ani = new Animal2();
//        ResultSet rs = null;
//        setQuery(sentencia);
//        try {
//            setPst(getConDB().prepareStatement(getQuery()));
//            rs = getPst().executeQuery();
//            while (rs.next()) {
//
//
//                ani.setNombre(rs.getString("nombre"));
//                ani.setFecha_nacimiento(rs.getDate("fecha_nac"));
//                ani.setMadre(rs.getString("madre"));
//                ani.setPadre(rs.getString("padre"));
//                ani.setUbicacion(rs.getString("ubicacion"));
//                return ani;
//            }
//            getPst().close();
//            rs.close();
//        } catch (SQLException ex) {
//            Logger.getLogger(AnimalDAO.class.getName()).log(Level.SEVERE, null, ex);
//        }
//        return ani;
//    }
}

